/**
 * 下拉框：combo
 * 
 * @author wanggang
 * 
 * @param condition = {
 * 	comboId : 'id'  combo的id,此id被用于存入值的那个input text的id ,
 *	comboName : 'name'  combo的name,此name被用于存入值的那个input text的name ,
 *	containerId : 'containerId'  放置此combo的容器div ,
 *	selectId : 'selectId'  如果此参数存在,那就代表从id为selectId的select中读取数据 ,
 *	url : '_url'  从后台读取数据的url ,
 *	autoSuggestUrl : 'autoSuggestUrl'  如果有此参数 ，就有autosuggest功能，并在此autosuggesturl中读取数据 ,
 * 	autoSuggestName : 'autoSuggestName'  使用autosuggest功能时的参数名 默认为autoSuggest,
 *	childId : 'childId'  如果要级连，那设置子combo的id , 此id为子combo的容器的id ,
 *	height : 'heigth px'  此combo的height , 此条件在多选时有用 ,
 *	width : 'width px'  此combo的width , 在此width-20px就为数据显示区的width , 下拉按钮的width固定为20px ,
 *	multiple : 'true || yes || multiple'  是否支持多选 ,
 *	onchange : change  当值发生变化时的调用method ,
 * 	beforeChange : beforeChange  当文本框的值变化之前执行的方法,
 * 	afterChange : afterChange 当文本框变化之后执行的方法,
 * 	validateClass : 'validateClass' 用于验证的class
 * }
 **********************************************************************************/
/**
 * combo的构造函数
 */
aeroui.combo = function( condition ){
	// 容器的id
	this.container = condition.containerId;
	// 保存value的hidden的name，用于在后台取值
	this.comboName = condition.comboName;
	// 此combo的id为显示值的text的id，此id可用于较验
	this.comboId = condition.comboId;
	// 如果从下拉列表中读取信息，那设置此列表的信息的id,   从select中读取数据的优先级要高于从XML是读取数据
	this.selectId = condition.selectId || '';
	// 设置用于验证的class
	this.validateClass = condition.validateClass || '';
	// 读XML数据的URL
	this.url = condition.url || '';
	// 如果有autoSuggest功能时，autoSuggest的XML数据来源URL
	this.autoSuggestUrl = condition.autoSuggestUrl || '';
	// 如果是级连，设置子combo的id,此id为子combo的容器的id
	this.childId = condition.childId || '';
	// 利用autosuggest功能时，向后台请求的参数名
	this.autoSuggestName = condition.autoSuggestName || aeroui.combo.constant.autoSuggest;
	// combo的高度，默认为20px
	this.height = condition.height || aeroui.combo.constant.height;
	// combo的宽度，默认为150px
	this.width = condition.width || aeroui.combo.constant.width;
	// 是否多选,默认为不可多选
	this.multiple = ( condition.multiple === 'selected' || condition.multiple === 'yes' || condition.multiple === 'true' || condition.multiple === true ) ? true : false;
	// 当文本框中的值发生变化时执行的方法
	this.onchange = condition.onchange || function(){};
	// 当文本框的值变化之前执行的方法
	this.beforeChange = condition.beforeChange || function(){};
	// 当文本框变化之后执行的方法
	this.afterChange = condition.afterChange || function(){};
	// 设置选中的默认值集合
	this.defaults = [];
	// 设置选中的默认的hidden
	this.hiddens = []
	// 设置数据的value集合
	this.values = [];
	// 设置数据的keys集合
	this.keys = [];
	// 图标的集合
	this.imgs = [];
	try{
		// 设置显示UI
		this.buildUI();
		// 读取数据，并填充下拉列表
		this.fillData();
	}catch( e ){
		window.alert(e);
	}
}
/**
 * combo的常量
 */
aeroui.combo.constant = {
	author : 'wanggang',
	version : '0.1',
	height : '20',
	width : '150',
	comboDivCss : 'aeroui_combo_div',
	comboTextCss : 'aeroui_combo_text',
	comboButtonCss : 'aeroui_combo_button',
	xmlRoot : 'combo', // XML文件的根节点
	xmlNode : 'item', // XML文件的子节点
	dataListCss : 'aeroui_combo_dataList' , // 下拉列表的div的class
	dataListHiddenCss : 'aeroui_combo_dataList_hidden', // 下拉列表的隐藏的样式
	dataItemCss : 'aeroui_combo_dataItem' , // 下拉列表的每一项的class
	dataItemMouseoverCss : 'aeroui_combo_dataItem_mouseover', // 下拉列表项的mouseover样式
	dataItemSpanCss : 'aeroui_combo_dataItemSpan', // 下拉列表的每一项的span的class
	dataListIdPrefix : 'aeroui_combo_',  // 下拉列表div的前缀
	autoSuggest : 'autoSuggest', // autoSuggest时向后台传入的默认参数名
	dataListMaxHeight : '200'
}
/**
 * 设置UI 
 * 显示值的text与button
 */
aeroui.combo.prototype.buildUI = function(){
	// 取出容器
	var _container = document.getElementById( this.container );
	if( null === _container ){
		throw '没有找到id为'+this.container+'的div';
	}
	var _constant = aeroui.combo.constant;
	// 创建一个div用于存放input text与input button
	var _div = document.createElement('div');
	// 设置此div的class
	$( _div ).addClass( _constant.comboDivCss );
	// 设置combo的width与height
	$( _div ).css( {
		width : this.width + 'px',
		height : this.height + 'px'
	} );
	// 创建一个input text
	var _text = document.createElement( 'input' );
	// 设置text的onchange事件
	$( _text ).bind( 'change' , _textChange );
	// 设置text的onkeypress事件
	$( _text ).bind( 'keyup' , _textKeyup );
	// 设置此input的type
	$( _text ).attr( 'type' , 'text' );
	// 设置此input text的class
	$( _text ).addClass( _constant.comboTextCss );
	// 添加用于验证的class 
	$( _text ).addClass( this.validateClass );
	// 设置input text的width与height
	$( _text ).css( {
		width : ( this.width - 20 ) + 'px',
		height : this.height + 'px'
	} );
	// 设置此input text的id,因为有此id的存在可以用于较验
	$( _text ).attr( 'id' , this.comboId );
	// 取消浏览器的自身的autocomplate功能
	$( _text ).attr( 'autocomplete' , 'off' );
	// 如果没有autosuggest的功能，那就绑定click事件与设置此input text只读
	if( '' === this.autoSuggestUrl ){
		$( _text ).bind( 'click' , _textClick );
		$( _text ).attr( 'readonly' , 'readonly' );
	}
	// 把此元素添加到div
	$( _div ).append( _text );
	// 创建input hidden
	var _hidden = document.createElement('input');
	// 设置name用于后台取数据 
	$( _hidden ).attr('name' , this.comboName);
	// 设置type
	$( _hidden ).attr('type' , 'hidden');
	// 添加到div
	$( _div ).append( _hidden );
	// 创建打开或关闭下拉列表的button
	var _btn = document.createElement( 'input' );
	// 设置此button的class
	$( _btn ).addClass( _constant.comboButtonCss );
	// 设置button的type
	$( _btn ).attr( 'type' , 'button' );
	// 添加click事件 
	$( _btn ).bind( 'click' , _btnClick );
	// 添加到div中
	$( _div ).append( _btn );
	// 清空容器
	$( _container ).html( '' );
	// 把此div添加到容器中
	$( _container ).append( _div );
	// 保存上下文
	var that = this;
	// input text的onchange事件
	function _textChange(){
		// 调用客户端程序员设置的change , 程序运行的上下文为input text
		that.onchange.call( _text );
	} 
	// input text的keypress事件 , 当key为非功能键时就进行autosuggest
	// item的keypress事件 , 当按下向上与向下箭头时向上或向上移动选中的下拉项 并把值放入文本区与隐藏区
	// 如果当前设置了autosuggesturl就具有autosuggest的功能;
	// autosuggest是当input text 触发keyup事件时要进行以下几个动作:
	// 1、打开dataList
	// 2、利用autosuggesturl请求后台的数据，并调用XML解析器进行解析
	// 3、利用得到的数据重绘dataList
	// 4、利用向上与向下箭头来重选数据下拉列表的下拉项
 	function _textKeyup( event ){
 		// 如果按下了ctrl就不再进行上下移动
 		var ev = event || window.event;
 		var code = ev.keyCode || ev.which;
 		if( ev.ctrlKey ){
 			return;
 		}
 		// 取出下拉列表div
 		var list_data = document.getElementById( _constant.dataListIdPrefix + that.container );
 		// 取出所有子节点
 		var childs = _getChilds( list_data );
 		// 查找出当前子节点中那一个处于选中状态
 		var selected = 0;
 		// 输入值的文本框
		var __text = _getFirstChild( _getFirstChild( document.getElementById( that.container ) ) );
 		for( var i=0; i<childs.length;i++  ){
 			// 如果此项有mouseover的css那就代表其处于选中状态 , 不考虑多选状态时的操作，所以找到一个就不再找了
 			// 应该是查看谁的值与此值相等
 			if( $( _getFirstChild( childs[i] ) ).text() == $( __text ).val() ){
 				selected = i;
 				break;
 			}
 		}
 		// 如果是向下移动就把当前节点的下一个节点设置为选中
 		if( code == 40 ){
 			// 如果当前选中节点已为最后一个节点 ， 此次操作无效
 			if( selected === childs.length-1 ){
 				return;
 			}else{
 				// 去除当前节点的选中状态
 				// 删除mouseover的css样式
 				$( childs[ selected ] ).removeClass( _constant.dataItemMouseoverCss );
 				// 当前下一个节点的选中状态
 				// 添加mouseover的css样式
 				$( childs[ selected + 1 ] ).addClass( _constant.dataItemMouseoverCss );
 				// 修改当前值为input text值与input hidden值
 				$( __text ).val( $( childs[ selected + 1 ] ).text() );
 				$( _getNext( __text ) ).val( $( _getNext( childs[ selected + 1 ] ) ).val() );
 			}
 			return;
 		}
 		// 如果是向上移动就把当前节点的上一个节点设置为选中
 		if( code == 38 ){
 			// 如果当前选中已经是第一个节点 ， 此次操作无效
 			if( selected === 0 ){
 				return;
 			}else{
 				// 去除当前节点的选中状态
 				// 删除mouseover的css样式
 				$( childs[ selected ] ).removeClass( _constant.dataItemMouseoverCss );
 				// 添加mouseover的css样式
 				$( childs[ selected - 1 ] ).addClass( _constant.dataItemMouseoverCss );
 				// 修改当前值为input text值与input hidden值
 				$( __text ).val( $( childs[ selected - 1 ] ).text() );
 				$( _getNext( __text ) ).val( $( _getNext( childs[ selected - 1 ] ) ).val() );
 			}
 			return;
 		}
 		// 如果是enter键
 		if( code == 13 ){
 			$( list_data ).addClass( _constant.dataListHiddenCss );
 		}
 		// 判断是否有autosuggest的功能 , 如果autosuggesturl不为''就表示要求有autosuggest的功能
 		if( that.autoSuggestUrl !== '' ){
 			// 判断当前的key是请求的那个key
 			// 如果当前点击的键为非功能键、非enter键( 可以是删除键code==8 )
 			if( ( code == 32 || (65 <= code && code <= 65 + 25)
                        || ( 97 <= code && code <= 97 + 25 ) 
                        || code==8 ) ){
 				// 如果当前功能为autosuggest的功能，就要找打开dataList , 如果dataList已打开了，就不再打开
 				if( $( list_data ).hasClass( _constant.dataListHiddenCss ) ){
 					$( list_data ).removeClass( _constant.dataListHiddenCss );
 				}
	 			// 调用请求数据 , 把数据都存在了that.values与that.keys与that.defaults中
	 			// 同步input text与input hidden之间的值
	 			$( _getNext( __text ) ).val( $( __text ).val() );
	 			var __url;
	 			if( that.autoSuggestUrl.indexOf('?')!=-1 ){
	 				__url = that.autoSuggestUrl + '&'+_constant.autoSuggest + '='+$( __text ).val();
	 			}else{
	 				__url = that.autoSuggestUrl + '?'+_constant.autoSuggest + '='+$( __text ).val();
	 			}
	 			that.loadXML( __url , true );
 			}
 		}
// 		inFstop( ev );
// 		inFabort( ev );
 	}
 	
	// input button的click事件
	function _btnClick( event ){
		// 如果此dataList的class为显示的就设置为display none , 反之设置为display block
		// 取出dataList
		// 取出下拉列表的div
	 	var _constant = aeroui.combo.constant;
	 	var _dataList = document.getElementById( _constant.dataListIdPrefix + that.container );
	 	if( $( _dataList ).hasClass( _constant.dataListHiddenCss ) ){
	 		$( _dataList ).removeClass( _constant.dataListHiddenCss );
	 		// 取出input text的值，与下拉框中的值进行比较，如果相同就设置为选中
		 	var input_text = _getFirstChild( _getFirstChild( document.getElementById( that.container ) ) );
		 	var _val = $( input_text ).val();
		 	var childs = _getChilds( _dataList );
		 	for( var i=0;i<childs.length;i++ ){
		 		if( _val === $( _getFirstChild( childs[i] ) ).text() ){
		 			$( childs[i] ).addClass( _constant.dataItemMouseoverCss );
		 		}
		 	}
		 	// 在此为document bind click 事件 来hidden dataList
		 	$( document ).bind('click' , document_click);
	 	}else{
	 		$( _dataList ).addClass( _constant.dataListHiddenCss );
	 		$( document ).unbind('click' , document_click);
	 	}
	 	// document的click事件
	 	function document_click(){
	 		$( _dataList ).addClass( _constant.dataListHiddenCss );
	 	}
	 	// 把光标定位到文本框
 		$( input_text ).focus();
 		// 停止事件流
 		var ev = event || window.event;
 		inFstop( ev );
 		inFabort( ev );
	}
	// 当没有autosuggest功能时，点击click事件
	function _textClick( event ){
		// 调用input button的事件
		_btnClick( event );
	}
}
/**
 * 数据填充到下拉列表
 */
 aeroui.combo.prototype.fillData = function(){
 	// 读取数据 , 并把数据放到values集合与keys集合与defaults集合中
 	this.readData();
 }
/**
 * 读取数据 , 优先从下拉列表中读取数据
 */
 aeroui.combo.prototype.readData = function(){
	if( '' === this.selectId && '' === this.url ){
		throw '没有配置任何数据源!';
	}
	// 优先从下拉列表中读取数据
	var _select = document.getElementById( this.selectId );
	if( null === _select && ''!== this.selectId ){
		throw '没有找到id为'+this.selectId+'的select!';
	}
	// 如果此selectid设置为''就从XML中读取
	if( ''===this.selectId ){
		this.loadXML( this.url , false );
	}else{
		this.loadFromSelect( _select );
	}
 }
 /**
  * 从XML中读取信息
  * 此方法为了能在autosuggest的功能中重用，所以把_url以参数的方法传入
  * 如果传入true就表示此次操作为autosuggest操作，否则为正常操作
  */
 aeroui.combo.prototype.loadXML = function( _xmlurl , isAutoSuggest ){
 	// 清空当前的values与keys与defaults与hiddens的数据
 	this.values = [];
 	this.keys = [];
 	this.defaults = [];
 	this.hiddens = [];
 	this.imgs = [];
 	var that = this;
 	// 如果没有传入isAutoSuggest那就设置为false
 	var _isAuto = isAutoSuggest || false;
 	// 从后台请求XML数据
 	var __url = parseURL( _xmlurl );
 	$.ajax({
 		url : __url.URL ,
 		type : 'POST' ,
 		cache : false ,
 		dataType : 'xml' ,
 		data : __url.args ,
 		success : function( result ){
 			try{
	 			// 取出后台返回的XML数据
	 			parseXML( result );
	 			// 创建一个下拉列表视图
	 			that.buildDataList( _isAuto );
 			}catch(e){
 				window.alert( e );
 			}
 		} ,
 		error : function( result ){
 			window.alert( result.responseText );
 		}
 	});
 	// 解析XML
 	function parseXML( result ){
 		var _constant = aeroui.combo.constant;
 		// 取出根节点
 		var root = result.getElementsByTagName( _constant.xmlRoot );
 		if( root.length == 0 ){
 			throw '没有找到根节点' + _constant.xmlRoot;
 		}
 		if( root.length > 1 ){
 			throw '找到多个根节点' + _constant.xmlRoot;
 		}
 		var tag = root[0].tagName;
 		if( root[0].tagName != _constant.xmlRoot ){
 			throw '请求根节点'+_constant.xmlNode+',却得到根节点'+root[0].tagName;
 		}
 		// 取出root的所有子节点
 		var childs = _getChilds( root[0] );
 		// 处理每一个item
 		for( var i=0;i<childs.length;i++ ){
 			// 判断tagName，如果此tagName不正确就抛出异常
 			if( childs[i].tagName !== _constant.xmlNode ){
 				throw 'XML数据中的第'+(i+1)+'个子节点错误,正确节点名为'+_constant.xmlNode+' , 错误的节点名'+childs[i].tagName;
 			}
 			// 取出对应的value与text
 			var _value = $( childs[i] ).attr( 'value' );
 			var _img = $( childs[i] ).attr( 'img' );
 			var _txt = _getText( childs[i] );
 			if( ''===_value || typeof( _value )=='undefined' ){
 				_value = _txt;
 			}
 			// 取出是否选中
 			var _sele = $( childs[i] ).attr( 'selected' );
 			if( _sele === 'selected' || _sele === 'yes' || _sele === 'true' || _sele === true ){
 				// 添加到默认集合
 				that.defaults.push( _txt );
 				that.hiddens.push( _value );
 			}
 			// 添加信息到对应数据
 			that.values.push( _value );
 			that.keys.push( _txt );
 			that.imgs.push( _img );
 		}
 	}
 }
 /**
  * 从select中读取数据
  */
 aeroui.combo.prototype.loadFromSelect = function( _select ){
 	// 取出_select的所有子节点
 	var childs = _getChilds( _select );
 	// 此处的集合为options , 取出其中的value与文本节点，如果value为null或''就把当前value设置为文本节点
 	for( var i=0;i<childs.length;i++ ){
 		var _value = $( childs[i] ).val();
 		var _txt = _getText( childs[i] );
 		if( ''===_value ){
 			_value = _txt;
 		}
 		var _selected =  childs[i].selected ;
 		// 如果此项为selected = selected就设置为defaults的集合
 		if( _selected ===true ){
 			this.defaults.push( _txt );
 			this.hiddens.push( _value );
 		}
 		// 把value与key放到对应的数组中
 		this.values.push( _value );
 		this.keys.push( _txt );
 	}
 	// 创建一个下拉列表视图
	this.buildDataList( false );
 }
 /**
  * 创建一个下拉列表
  * 此下拉列表不能为单例 , 但是可以保证一个combo一个的singleton , 如果要为singleton就应该是在点按钮时才加载数据
  * 视图的结构为
  * div{
  * 	div{
  * 		input hidden
  * 		span 
  * 	}
  * }
  * 如果传入参数true就表示当前操作为autoSuggest操作 , 反之为普通操作
  */
 aeroui.combo.prototype.buildDataList = function( _isAuto ){
 	var _constant = aeroui.combo.constant;
 	var _listDiv = document.getElementById( _constant.dataListIdPrefix + this.container );
 	if( null === _listDiv ){
	 	// 从文档流中取出div，如果没有就创建一个
	 	var _listDiv = document.createElement( 'div' );
	 	// 设置此div的样式
	 	$( _listDiv ).addClass( _constant.dataListCss );
	 	// 设置此div的id
	 	$( _listDiv ).attr( 'id' , _constant.dataListIdPrefix + this.container );
 	}
 	// 先清空此div中的所有子节点
 	$( _listDiv ).html( '' );
 	// 从values的集合中取出数据进行视图的建立
 	for( var i=0 ; i<this.values.length ; i++ ){
 		// 创建下拉列表项
 		var _item = document.createElement( 'span' );
 		// 添加css样式
 		$( _item ).addClass( _constant.dataItemCss );
 		if( null != this.imgs[i] && typeof( this.imgs[i] )!= 'undefined' && '' != this.imgs[i] ){
	 		$( _item ).css( {
	 			backgroundImage : 'url("'+ this.imgs[i] +'")',
	 			backgroundPosition : 'left top',
	 			backgroundRepeat : 'no-repeat',
	 			paddingLeft : '25px'
	 		} );
	 		// 修改ie与firefix的不同之处
	 		if( !document.all ){
	 			$( _item ).css( {
	 				width : ( this.width - 25 ) + 'px'
	 			} );
	 		}
 		}
 		// 添加onmouseover事件
 		$( _item ).bind( 'mouseover' , itemMouseover );
 		// 添加onmouseout事件
 		$( _item ).bind( 'mouseout' , itemMouseout );
 		// 添加onclick事件
 		$( _item ).bind( 'click' , itemClick );
 		// 创建一个span
 		var _span = document.createElement( 'span' );
 		// 添加span的样式
 		$( _span ).addClass( _constant.dataItemSpanCss );
 		// 设置此span的值
 		$( _span ).text( this.keys[i] );
 		// 添加到下拉项
 		$( _item ).append( _span );
 		// 设置保存value的input hidden
 		var _hidden = document.createElement( 'input' );
 		// 设置它的type
 		$( _hidden ).attr( 'type' , 'hidden' );
 		// 把value的值放到此hidden中
 		$( _hidden ).val( this.values[i] );
 		// 添加到下拉项
 		$( _item ).append( _hidden );
 		// 下拉项添加到下拉列表
 		$( _listDiv ).append( _item );
 	}
 	// 如果此次构建是autosuggest的结果，那就不再请求默认值
 	if( !_isAuto ){
	 	// 把默认项设置为input text的显示项
	 	var input_text = _getFirstChild( _getFirstChild( document.getElementById( this.container ) ) );
	 	$( input_text ).val( this.defaults.join(',') );
	 	// 设置的默认的input hidden的值
	 	$( _getNext( input_text ) ).val( this.hiddens.join(',') );
 	}
 	// 把下拉列表添加到文档
 	$( document.body ).append( _listDiv );
 	// 设置此下拉列表显示的位置
 	var _realComboDiv = _getFirstChild( document.getElementById( this.container ) );
 	var _offset = $( _realComboDiv ).offset();
 	$( _listDiv ).css( {
 		left : _offset.left + 'px',
 		top : ( _offset.top + $( _realComboDiv ).height() + 2 ) + 'px',
 		width : ( $( _realComboDiv ).width() + 2) + 'px'
 	} );
 	// 如果当操作来自于autosuggest功能，那就不再hidden dataList
 	if( !_isAuto ){
	 	// 添加一个隐藏的css样式
	 	$( _listDiv ).addClass( _constant.dataListHiddenCss );
 	}
 	// 如果下拉列表的内容太多就显示滚动条
 	if( $( _listDiv ).height() > _constant.dataListMaxHeight ){
 		$( _listDiv ).css( {
 			height : _constant.dataListMaxHeight + 'px'
 		} );
 	}
 	// 保存上下文
 	var that = this;
 	// 是否按下了ctrl键
 	var _ctrl = false;
 	// span的click事件
 	function itemClick(){
 		// click此项时把此项的text设置为input text的value，并把_dataList display none
 		var _txt = $( _getFirstChild( this ) ).text();
 		// 取出input text节点
 		var _text = _getFirstChild( _getFirstChild( document.getElementById( that.container ) ) );
 		// 把以上的的_txt设置为value
 		$( _text ).val( _txt );
 		// 修改隐藏的value
 		var _hidden = _getLastChild( this ) ;
 		var __hidden = _getNext( _text );
 		$( __hidden ).val( $( _hidden ).val() );
 		// 隐藏_dataList display none;
 		that.hiddenDataList();
 	}
 	// item的mouseover事件
 	function itemMouseover(){
 		// 去除其它所有选中状态的样式
 		var _parent = _getParent( this );
		var siblings = _getChilds( _parent );
		for( var i=0;i<siblings.length;i++ ){
			itemMouseout.call( siblings[i] );
		}
 		// 添加mouseover的css样式
 		$( this ).addClass( _constant.dataItemMouseoverCss );
 	}
 	// item的mouseout事件
 	function itemMouseout(){
 		// 删除mouseover的css样式
 		$( this ).removeClass( _constant.dataItemMouseoverCss );
 	}
 	
 }
 /**
  * 隐藏下拉列表
  */
 aeroui.combo.prototype.hiddenDataList = function(){
 	// 取出下拉列表的div
 	var _constant = aeroui.combo.constant;
 	var _dataList = document.getElementById( _constant.dataListIdPrefix + this.container );
 	// 添加hidden的class
 	$( _dataList ).addClass( _constant.dataListHiddenCss );
 }
 /**
  * 显示下拉列表
  */
 aeroui.combo.prototype.showDataList = function(){
 	// 取出下拉列表的div
 	var _constant = aeroui.combo.constant;
 	var _dataList = document.getElementById( _constant.dataListIdPrefix + this.container );
 	// 删除hidden的class
 	$( _dataList ).removeClass( _constant.dataListHiddenCss );
 	// 取出input text的值，与下拉框中的值进行比较，如果相同就设置为选中
 	var _val = $( _getFirstChild( _getFirstChild( document.getElementById( this.container ) ) ) ).val();
 	var childs = _getChilds( _dataList );
 	for( var i=0;i<childs.length;i++ ){
 		if( _val === $( _getFirstChild( childs[i] ) ).text() ){
 			$( childs[i] ).addClass( _constant.dataItemMouseoverCss );
 		}
 	}
 }
 